package vue;

import java.awt.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.swing.*;
import controleur.*;
import modele.*;
import modele.Point;

public class Dessin extends JPanel implements Serializable {

	private Groupe groupeDeFormes = new Groupe();
	private String choixOutil = "Point";
	private Color choixCouleur = Color.black;
	private FormeGeometrique formeTampon;
	private Dimension dimensionDessin;
	private IndicateurSouris unindicateurSouris;
	private MonControleurSouris mcs;
	
	
	public Dessin(Dimension d) {
		super();
		this.dimensionDessin =d;
		System.out.println("Instanciation de Dessin");
		mcs = new MonControleurSouris(this);
 		this.addMouseListener(mcs);
 		this.addMouseMotionListener(mcs);		
		this.setPreferredSize(dimensionDessin);  
		this.setBackground(Color.white);
	}
	
	public Groupe getGroupeDeFormes() {return groupeDeFormes;}
	public void setGroupeDeFormes(Groupe monGroupe) {this.groupeDeFormes = monGroupe;}

	public FormeGeometrique getFormeTampon() {return formeTampon;}
	public void setFormeTampon(FormeGeometrique formeTampon) {this.formeTampon = formeTampon;}

	public String getChoixOutil() {	return choixOutil;}
	public void setChoixOutil(String choixOutil) {this.choixOutil = choixOutil;}
	
	public Color getChoixCouleur() {return choixCouleur;}
	public void setChoixCouleur(Color choixCouleur) {this.choixCouleur = choixCouleur;	}
	
	public IndicateurSouris getUnindicateurSouris() {return unindicateurSouris;}
	public void setUnindicateurSouris(IndicateurSouris unindicateurSouris) {
		this.unindicateurSouris = unindicateurSouris;
		this.unindicateurSouris.setPreferredSize(new Dimension(this.dimensionDessin.width,20));
	}

	public Dimension getDimensionDessin() {return dimensionDessin;}
	public void setDimensionDessin(Dimension dimensionDessin) {this.dimensionDessin = dimensionDessin;}



	
	public void paintComponent(Graphics g) {
		super.paintComponent(g); //il vaut mieux d'apres la doc appeler d'abord le code du parent.
		//System.out.println("Dessin.paintComponent est éxécutée");
		
		if (formeTampon instanceof Polygone)
		{
			Polygone p = (Polygone) formeTampon;
			//System.out.println("La formeTampon est un polygone");
			dessinerPolygone(p,this.choixCouleur,g,true);	
			}
		
		if (formeTampon instanceof Segment)
		{
		Segment s = (Segment) formeTampon;
		//System.out.println("la forme tampon est un segment");
		dessinerSegment(s, this.choixCouleur, g,true);
		}
		

		
		// Ensuite on dessine tout le groupe
		for (FormeGeometrique item : groupeDeFormes.getlesFormes()) {
			if (item instanceof Point) {
				Point p = (Point) item;
				//System.out.println("Dessin d'un point :"+ p.getCouleur());
				dessinerPoint(p,g);
			}
			if (item instanceof Segment) {
				Segment s = (Segment) item;
				//System.out.println("Dessin d'un segment : "+ s.getCouleur());
				dessinerSegment(s,s.getCouleur(),g,false);
			}
			if (item instanceof Polygone) {
				Polygone p = (Polygone) item;
				//System.out.println("Dessin d'un polygone : "+ p.getCouleur());
				dessinerPolygone(p,p.getCouleur(),g,false);	
			}
		}
	}

	
	public void clear() {
		System.out.println("dans la méthode effacer");
		this.groupeDeFormes = new Groupe();
		this.formeTampon = null;
		this.repaint();
	}
	
	public void sauvegarder(String path){
		FileOutputStream fos;
		try {
		fos = new FileOutputStream(path);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(this);		
		oos.close();
		}
		catch(Exception e){
			System.out.println("Problem in save process");
		}
	}
	
	public void stockFormeTampon(){
		if (getFormeTampon() instanceof Polygone){
			Polygone poly = (Polygone) getFormeTampon();
			poly.setCouleur(getChoixCouleur());
		this.getGroupeDeFormes().addForme(poly);
		this.setFormeTampon(null); //pour que la formeTampon soit plus rien
		}
		
		if (getFormeTampon() instanceof Segment){
			Segment seg = (Segment) getFormeTampon();
			if (seg.getOrigine() != null && seg.getExtremite() !=null)
			{
			seg.setCouleur(getChoixCouleur());
			this.getGroupeDeFormes().addForme(seg);		
			}
			this.setFormeTampon(null);
		}
		
		this.repaint();
	}


	public void dessinerPolygone(Polygone p, Color c, Graphics g, boolean editmode){
		
		int nPoints = p.getListPoints().size();
		int[] xPoints = new int[nPoints];
		int[] yPoints = new int[nPoints];
		int i = 0;
		for (Point point : p.getListPoints()) {
			xPoints[i] = point.getX();
			yPoints[i] = point.getY();
			if (editmode) {g.fillOval(point.getX(),point.getY(),5,5);}
			i++;
		}
		g.setColor(c);
		if (p.getCosed()) g.drawPolygon(xPoints, yPoints, nPoints);
		if (!p.getCosed()) g.drawPolyline(xPoints, yPoints, nPoints);
	}
	
	public void dessinerPoint(Point p, Graphics g){
		int taille = 20;
		g.setColor(p.getCouleur());
		g.fillOval(p.getX()-taille/2, p.getY()-taille/2, taille, taille);
	}
	
	public void dessinerSegment(Segment s,Color c, Graphics g,boolean editmode){
		if (s.getOrigine() != null && s.getExtremite() != null)
		{
		g.setColor(c);			
		if (editmode) {
			//g.fillOval(s.getOrigine().getX(),s.getOrigine().getY(),5,5);
			g.drawLine(s.getOrigine().getX()-5, s.getOrigine().getY()-5, s.getOrigine().getX()+5, s.getOrigine().getY()+5);
			g.drawLine(s.getOrigine().getX()-5, s.getOrigine().getY()+5, s.getOrigine().getX()+5, s.getOrigine().getY()-5);
			//g.fillOval(s.getExtremite().getX(),s.getExtremite().getY(),5,5);
			g.drawLine(s.getExtremite().getX()-5, s.getExtremite().getY()-5, s.getExtremite().getX()+5, s.getExtremite().getY()+5);
			g.drawLine(s.getExtremite().getX()-5, s.getExtremite().getY()+5, s.getExtremite().getX()+5, s.getExtremite().getY()-5);
		}
		g.drawLine(s.getOrigine().getX(),s.getOrigine().getY(), s.getExtremite().getX(), s.getExtremite().getY());
		}
		
		if (editmode && s.getOrigine() != null && s.getExtremite() == null)
		{
		g.setColor(c);			
		//g.fillOval(s.getOrigine().getX(),s.getOrigine().getY(),2,2);
		g.drawLine(s.getOrigine().getX()-5, s.getOrigine().getY()-5, s.getOrigine().getX()+5, s.getOrigine().getY()+5);
		g.drawLine(s.getOrigine().getX()-5, s.getOrigine().getY()+5, s.getOrigine().getX()+5, s.getOrigine().getY()-5);

		}	
		}
		


}